package xjf.learn.lambda;

import org.junit.Test;

import javax.swing.text.DateFormatter;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;

/**
 * 1. Lambda 表达式初识
 *
 * @Author: xjf
 * @Date: 2020/4/9 0:01
 */
public class Test1 {

    /**
     * 1.匿名内部类的使用方式
     */
    @Test
    public void test1(){
        int a = 0;

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
//                a = 10;
                return Integer.compare(o1, o2);
            }
        };

        TreeSet<Integer> treeSet = new TreeSet<>(comparator);
        treeSet.add(10);
        treeSet.add(800);
        treeSet.add(1);
        treeSet.add(99);

        for (Integer integer : treeSet) {
            System.out.println(integer);
        }
    }

    /**
     * 2. 使用 Lambda 表达式实现相同效果
     */
    @Test
    public void test2(){
       /* int b = 0;
        Comparator<Integer> comparator = (o1, o2) -> {
            b = 10;
            return Integer.compare(o1, o2);
        };*/

        Comparator<Integer> comparator = (o1,o2) -> Integer.compare(o1, o2);

        TreeSet<Integer> treeSet = new TreeSet<>(comparator);
        treeSet.add(10);
        treeSet.add(800);
        treeSet.add(1);
        treeSet.add(99);

        for (Integer integer : treeSet) {
            System.out.println(integer);
        }
    }

    /**
     * 3. 局部变量的使用： Lambda 和匿名内部类是一致的，所使用的局部变量必须是 final 的
     *
     * Lambda 表达式中引用的局部变量必须是 final 或既成事实上的 final 变量 —— 引用自《Java8 函数式编程》（王群锋译）
     */
    @Test
    public void test3(){
        /*final */String name = "aaa";
//        name = "bbb";

        List<String> list = Arrays.asList("111", "222", "333");

        list.forEach(s -> System.out.println(name));
    }
}
